
package SintaticoPacote;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Igo
 */
public class cmd {

    public boolean sintaxeCmd (TabelaSimbolos tabelasimbolos){

        chamadaDeFuncao funcao = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao atribuicao = new ExpAtribuicao();
        entradaDeDados entradaDados = new entradaDeDados();
        saidaNaTela saidaTela = new saidaNaTela();
        cmdCondicional condicional = new cmdCondicional();
        cmdRepeticao repeticao = new cmdRepeticao();
        declaracaoVariaveis variaveis = new declaracaoVariaveis(tabelasimbolos);
        acessoStruct struct = new acessoStruct();

        
        // Verifica se é um identificador e chama chamada de função
        if(tabelasimbolos.getTipo().equals("identificador")) {

            if(tabelasimbolos.superLookahead(1).equals("[")) {
                int i = 1;
                while(tabelasimbolos.superLookahead(i).equals("["))
                    i += 3;

                if((tabelasimbolos.superLookahead(i).equals("->") || tabelasimbolos.superLookahead(i).equals(".")) &&
                        tabelasimbolos.superTipo(i+1).equals("identificador") &&
                        (tabelasimbolos.superLookahead(i+2).equals("=") ||
                        tabelasimbolos.superLookahead(i+2).equals("++") ||
                        tabelasimbolos.superLookahead(i+2).equals("--")))
                    atribuicao.expatribuicao(tabelasimbolos);

                else if(tabelasimbolos.superLookahead(i).equals("=") ||
                        tabelasimbolos.superLookahead(i).equals("++") ||
                        tabelasimbolos.superLookahead(i).equals("--"))
                    atribuicao.expatribuicao(tabelasimbolos);
            }

            else if((tabelasimbolos.superLookahead(1).equals("->") || tabelasimbolos.superLookahead(1).equals(".")) &&
                    tabelasimbolos.superTipo(2).equals("identificador") &&
                    (tabelasimbolos.superLookahead(3).equals("=") ||
                    tabelasimbolos.superLookahead(3).equals("++") ||
                    tabelasimbolos.superLookahead(3).equals("--")))
                atribuicao.expatribuicao(tabelasimbolos);

            else if(tabelasimbolos.superLookahead(1).equals("++") || tabelasimbolos.superLookahead(1).equals("--") ||
                    tabelasimbolos.superLookahead(1).equals("=") ) {
                if(atribuicao.expatribuicao(tabelasimbolos))
                    return true;
                else return false;
            }

            else if(tabelasimbolos.superTipo(1).equals("identificador")) {
                if(variaveis.declaraVariaveis())
                    return true;
                else return false;
            }

            else
                if(funcao.chamaFuncao())
                    return true;
                else return false;
        }

        else if(tabelasimbolos.getLookahead().equals("*")){
            if(atribuicao.expatribuicao(tabelasimbolos))
                return true;
            else return false;
        }
        
        else if(tabelasimbolos.getLookahead().equals("scanf")){
            if(entradaDados.entradadados(tabelasimbolos))
                return true;
            else return false;
        }

        else if(tabelasimbolos.getLookahead().equals("printf")){
            if(saidaTela.saidaTela(tabelasimbolos))
                return true;
            else return false;
        }

        else if(tabelasimbolos.getLookahead().equals("if")){
            if(condicional.comandoCondicional(tabelasimbolos))
                return true;
            else return false;
        }

        else if(tabelasimbolos.getLookahead().equals("while") | tabelasimbolos.getLookahead().equals("do") | tabelasimbolos.getLookahead().equals("for") ){
            if(repeticao.comandoRepeticao(tabelasimbolos))
                return true;
            else return false;
        }

        else if(tabelasimbolos.getTipo().equals("palavra")) {
            if(variaveis.declaraVariaveis())
                return true;
            else return false;
        }

        else return false;

        return true;

    }
}